home *** CD-ROM | disk | FTP | other *** search
/ Aminet 4 / Aminet 4 - November 1994.iso / aminet / dev / gcc / libnix.lha / gnu / lib / libnix / sources.lha / nix / stdio / open.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-07-23  |  2.8 KB  |  126 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <fcntl.h>
  4. #include <unistd.h>
  5. #include <limits.h>
  6. #undef LONGBITS
  7. #undef BITSPERBYTE
  8. #undef MAXINT
  9. #undef MININT
  10. #include <dos/dos.h>
  11. #define DEVICES_TIMER_H
  12. #include <dos/dosextens.h>
  13. #ifdef __GNUC__
  14. #include <inline/exec.h>
  15. #include <inline/dos.h>
  16. #endif
  17. #include <stabs.h>
  18.  
  19. extern void __seterrno(void);
  20.  
  21. unsigned long *__stdfiledes;
  22. static unsigned long stdfilesize=3;
  23. static long stderrdes; /* The normal Amiga shell sets no process->pr_CES stream -
  24.                         * we use Open("*",MODE_NEWFILE) in this case
  25.                         */
  26.  
  27. void __initstdio(void)
  28. { struct Process *p;
  29.   __stdfiledes=(unsigned long *)malloc(3*sizeof(unsigned long));
  30.   if(__stdfiledes==NULL)
  31.     exit(20);
  32.   p=(struct Process *)FindTask(NULL);
  33.   __stdfiledes[STDIN_FILENO ]=Input();
  34.   __stdfiledes[STDOUT_FILENO]=Output();
  35.   if(!(__stdfiledes[STDERR_FILENO]=p->pr_CES))
  36.     if(!(__stdfiledes[STDERR_FILENO]=stderrdes=Open("*",MODE_NEWFILE)))
  37.       __stdfiledes[STDERR_FILENO]=__stdfiledes[STDOUT_FILENO];
  38. }
  39.  
  40. /* Call our private constructor */
  41. ADD2INIT(__initstdio,-30);
  42.  
  43. void __exitstdio(void)
  44. { int i;
  45.  
  46.   for(i=3;i<stdfilesize;i++)
  47.     if(__stdfiledes[i])
  48.       close(__stdfiledes[i]);
  49.  
  50.   if(stderrdes)
  51.     Close(stderrdes);
  52. }
  53.  
  54. /* Call our private destructor at cleanup */
  55. ADD2EXIT(__exitstdio,-30);
  56.  
  57. int open(const char *path,int flags,...)
  58.   int file;
  59.  
  60.   for(file=0;file<stdfilesize;file++)
  61.     if(!__stdfiledes[file])
  62.       break;
  63.  
  64.   if(file>SHRT_MAX)
  65.     return -1;
  66.  
  67.   if(file==stdfilesize)
  68.   { unsigned long *tmp;
  69.     tmp=realloc(__stdfiledes,(stdfilesize+1)*sizeof(unsigned long));
  70.     if(tmp==NULL)
  71.       return -1;
  72.     __stdfiledes=tmp;
  73.     stdfilesize++;
  74.   }
  75.  
  76.   if((__stdfiledes[file]=Open((char *)path,flags&O_TRUNC?MODE_NEWFILE:
  77.                               flags&(O_WRONLY|O_RDWR)?MODE_READWRITE:MODE_OLDFILE)))
  78.   { if(ChangeMode(CHANGE_FH,__stdfiledes[file],
  79.                   flags&(O_WRONLY|O_RDWR)?MODE_NEWFILE:MODE_OLDFILE))
  80.       return file;
  81.     __seterrno();
  82.     Close(__stdfiledes[file]);
  83.     __stdfiledes[file]=0;
  84.     return -1;
  85.   }
  86.   __seterrno();
  87.   return -1;
  88. }
  89.  
  90. int close(int d)
  91. { int ret=-1;
  92.   if(d>2)
  93.   { ret=Close(__stdfiledes[d])?0:-1;
  94.     __stdfiledes[d]=0; }
  95.   return ret;
  96. }
  97.  
  98. off_t lseek(int d,off_t offset,int whence)
  99. { long r;
  100.   r=Seek(__stdfiledes[d],offset,whence==SEEK_SET?OFFSET_BEGINNING:
  101.          whence==SEEK_END?OFFSET_END:OFFSET_CURRENT);
  102.   if(r==EOF)
  103.     return r;
  104.   return Seek(__stdfiledes[d],0,OFFSET_CURRENT);
  105. }
  106.  
  107. ssize_t read(int d,void *buf,size_t nbytes)
  108. { long r;
  109.   r=Read(__stdfiledes[d],buf,nbytes);
  110.   if(r<0)
  111.     __seterrno();
  112.   return r;
  113. }
  114.  
  115. ssize_t write(int d,const void *buf,size_t nbytes)
  116. { long r;
  117.   r=Write(__stdfiledes[d],(char *)buf,nbytes);
  118.   if(r<0)
  119.     __seterrno();
  120.   return r;
  121. }
  122.  
  123. int isatty(int d)
  124. { return IsInteractive(__stdfiledes[d]); }
  125.